package com.rul.mars.user.controller;

import com.rul.mars.common.api.CommonResult;
import com.rul.mars.common.domain.UserDto;
import com.rul.mars.mbg.model.Role;
import com.rul.mars.mbg.model.User;
import com.rul.mars.user.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


/**
 * 用户服务接口
 *
 * @author RuL
 */
@Api(tags = "UserController", description = "用户服务接口")
@RestController
@RequestMapping(path = "/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 用户登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录结果
     */
    @ApiOperation("用户登录")
    @PostMapping("/login")
    public CommonResult login(@RequestParam(value = "username") String username,
                              @RequestParam(value = "password") String password) {
        return userService.login(username, password);
    }

    /**
     * 用户注册
     *
     * @param username 用户名
     * @param password 密码
     * @param phone    手机号
     * @param authCode 验证码
     * @return 用户注册结果
     */
    @ApiOperation("用户注册")
    @PostMapping("/register")
    public CommonResult register(@RequestParam(value = "username") String username,
                                 @RequestParam(value = "password") String password,
                                 @RequestParam(value = "phone") String phone,
                                 @RequestParam(value = "authCode") String authCode) {
        userService.register(username, password, phone, authCode);
        return CommonResult.success("注册成功");
    }

    /**
     * 获取验证码
     *
     * @param phone 接收验证的手机号
     * @return 验证码发送结果
     */
    @ApiOperation("获取验证码")
    @PostMapping("/authCode")
    public CommonResult authCode(@RequestParam(value = "phone") String phone) {
        userService.generateAuthCode(phone);
        return CommonResult.success("发送成功");
    }

    /**
     * 获取当前登录的用户信息
     *
     * @return 当前登录的用户信息
     */
    @ApiOperation("获取当前登录的用户信息")
    @GetMapping("/current")
    public CommonResult<User> current() {
        User user = userService.currentUser();
        return CommonResult.success(user);
    }


    /**
     * 修改密码
     *
     * @param password 新密码
     * @param phone    手机号
     * @param authCode 验证码
     * @return 验证码发送结果
     */
    @ApiOperation("修改密码")
    @PostMapping("/updatePassword")
    public CommonResult updatePassword(@RequestParam(value = "password") String password,
                                       @RequestParam(value = "phone") String phone,
                                       @RequestParam(value = "authCode") String authCode) {
        userService.updatePassword(password, phone, authCode);
        return CommonResult.success();
    }

    /**
     * 修改个人资料
     *
     * @param user 新的个人资料
     * @return 修改结果
     */
    @ApiOperation("修改个人资料")
    @PostMapping("/updateInfo")
    public CommonResult updateInfo(@RequestBody User user) {
        userService.updateInfo(user);
        return CommonResult.success();
    }

    /**
     * 获取指定用户的角色信息
     *
     * @param userId 用户ID
     * @return 用户角色信息
     */
    @ApiOperation("获取指定用户的角色")
    @GetMapping(value = "/role/{userId}")
    public CommonResult<List<Role>> getRoleList(@PathVariable(value = "userId") Long userId) {
        List<Role> roleList = userService.getRoleList(userId);
        return CommonResult.success(roleList);
    }

    /**
     * 给用户分配角色
     *
     * @param userId  用户ID
     * @param roleIds 角色ID列表
     * @return 分配结果
     */
    @ApiOperation("给用户分配角色")
    @PostMapping(value = "/role/update")
    public CommonResult updateRole(@RequestParam("adminId") Long userId,
                                   @RequestParam("roleIds") List<Long> roleIds) {
        int count = userService.updateRole(userId, roleIds);
        if (count >= 0) {
            return CommonResult.success(count);
        }
        return CommonResult.failed();
    }

    /**
     * 查询用户及角色信息（仅供权限模块使用）
     *
     * @param username 用户名
     * @return 用户及角色信息
     */
    @ApiOperation("用户及角色信息（仅供权限模块使用）")
    @GetMapping("/loadByUsername")
    public UserDto getUserDto(@RequestParam(value = "username") String username) {
        return userService.loadUserByUsername(username);
    }

}
